]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
extensionUtils: Add functions to (de)serialize extensions
authorDidier Roche <didrocks@ubuntu.com>
Thu, 1 Nov 2018 12:55:17 +0000 (13:55 +0100)
committerFlorian Müllner <florian.muellner@gmail.com>
Sat, 20 Jul 2019 14:17:35 +0000 (14:17 +0000)
Serializing an extension for sending over D-Bus is currently done by the
appropriate D-Bus method implementations. Split out the code as utility
function and add a corresponding deserialization function, which we will
soon use when consuming the D-Bus extension API from the extension-prefs
tool.

https://bugzilla.gnome.org/show_bug.cgi?id=789852

js/misc/extensionUtils.js
js/ui/shellDBus.js

index e701e824c146ac165e7565fc25b75efa9fc3b436..ea094ba7335c65ff27ddd89ff860f6afe1b8b89d 100644 (file)
@@ -3,11 +3,12 @@
 // Common utils for the extension system and the extension
 // preferences tool
 
+const { Gio, GLib } = imports.gi;
+
 const Gettext = imports.gettext;
+const Lang = imports.lang;
 const Signals = imports.signals;
 
-const Gio = imports.gi.Gio;
-
 const Config = imports.misc.config;
 const FileUtils = imports.misc.fileUtils;
 
@@ -29,6 +30,8 @@ var ExtensionState = {
     UNINSTALLED: 99
 };
 
+const SERIALIZED_PROPERTIES = ['type', 'state', 'path', 'error', 'hasPrefs'];
+
 // Maps uuid -> metadata object
 var extensions = {};
 
@@ -222,6 +225,52 @@ function createExtensionObject(uuid, dir, type) {
     return extension;
 }
 
+function serializeExtension(extension) {
+    let obj = {};
+    Lang.copyProperties(extension.metadata, obj);
+
+    SERIALIZED_PROPERTIES.forEach(prop => {
+        obj[prop] = extension[prop];
+    });
+
+    let res = {};
+    for (let key in obj) {
+        let val = obj[key];
+        let type;
+        switch (typeof val) {
+        case 'string':
+            type = 's';
+            break;
+        case 'number':
+            type = 'd';
+            break;
+        case 'boolean':
+            type = 'b';
+            break;
+        default:
+            continue;
+        }
+        res[key] = GLib.Variant.new(type, val);
+    }
+
+    return res;
+}
+
+function deserializeExtension(variant) {
+    let res = { metadata: {} };
+    for (let prop in variant) {
+        let val = variant[prop].unpack();
+        if (SERIALIZED_PROPERTIES.includes(prop))
+            res[prop] = val;
+        else
+            res.metadata[prop] = val;
+    }
+    // add the 2 additional properties to create a valid extension object, as createExtensionObject()
+    res.uuid = res.metadata.uuid;
+    res.dir = Gio.File.new_for_path(res.path);
+    return res;
+}
+
 function installImporter(extension) {
     let oldSearchPath = imports.searchPath.slice();  // make a copy
     imports.searchPath = [extension.dir.get_parent().get_path()];
index fad3cf0a2666c8aef8ecc9b94005f1319198e4b9..64e80b42f33911a297f4c3f01f21f84160d5aa4a 100644 (file)
@@ -1,7 +1,6 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 
 const { Gio, GLib, Meta, Shell } = imports.gi;
-const Lang = imports.lang;
 
 const Config = imports.misc.config;
 const ExtensionDownloader = imports.ui.extensionDownloader;
@@ -264,41 +263,8 @@ var GnomeShellExtensions = class {
     }
 
     GetExtensionInfo(uuid) {
-        let extension = ExtensionUtils.extensions[uuid];
-        if (!extension)
-            return {};
-
-        let obj = {};
-        Lang.copyProperties(extension.metadata, obj);
-
-        // Only serialize the properties that we actually need.
-        const serializedProperties = ["type", "state", "path", "error", "hasPrefs"];
-
-        serializedProperties.forEach(prop => {
-            obj[prop] = extension[prop];
-        });
-
-        let out = {};
-        for (let key in obj) {
-            let val = obj[key];
-            let type;
-            switch (typeof val) {
-            case 'string':
-                type = 's';
-                break;
-            case 'number':
-                type = 'd';
-                break;
-            case 'boolean':
-                type = 'b';
-                break;
-            default:
-                continue;
-            }
-            out[key] = GLib.Variant.new(type, val);
-        }
-
-        return out;
+        let extension = ExtensionUtils.extensions[uuid] || {};
+        return ExtensionUtils.serializeExtension(extension);
     }
 
     GetExtensionErrors(uuid) {